package modelo.pieza;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;

import modelo.excepcion.ExcepcionDeMovimientoInvalido;
import modelo.movimiento.TipoDeMovimiento;
import modelo.tablero.Casilla;
import modelo.tablero.Color;

/**
 * 
 * 
 * @author Victor Del Rio
 */
public abstract class Pieza {

	private Color color;
	private Casilla casilla;
	private Collection<TipoDeMovimiento> tiposDeMovimiento = new ArrayList<TipoDeMovimiento>();
	private Boolean enJuego = true;
	
	
	/*------------------------------------ Constructors ------------------------------------*/

	public Pieza(Color color) {
		this.color = color;
	}

	/*--------------------------------------------------------------------------------------*/
	/*------------------------------------ Public methods ----------------------------------*/

	public Collection<Casilla> casillasPermitidas() {
		
		Set<Casilla> casillasPermitidas = new HashSet<Casilla>();
		
		for (TipoDeMovimiento tipoDeMovimiento : tiposDeMovimiento) {
			casillasPermitidas.addAll(tipoDeMovimiento.casillasPermitidas(this.casilla));
		}
		
		return casillasPermitidas;
	}
	
	public void mover(Casilla casilla) throws ExcepcionDeMovimientoInvalido {
		
		if (!this.puedeMover(casilla)) {
			throw new ExcepcionDeMovimientoInvalido("la pieza no puede mover a la casilla indicada");
		}
			
		casilla.alojar(this);
	}
	
	public Boolean puedeMover(Casilla casilla) {
		return this.casillasPermitidas().contains(casilla);
	}
	
	public void comer() {
		
		this.enJuego = false;
		this.casilla = null;
	}

	/*--------------------------------------------------------------------------------------*/
	/*---------------------------------- Geters and seters ---------------------------------*/

	public Color getColor() {
		return color;
	}
	
	public Casilla getCasilla() {
		return casilla;
	}
	
	public Collection<TipoDeMovimiento> getTiposDeMovimiento() {
		return tiposDeMovimiento;
	}
	
	// TODO solo tendría que ser accesible para la clase Casilla
	public void setCasilla(Casilla casilla) {
		this.casilla = casilla;
	}
	
	public Boolean isEnJuego() {
		return enJuego;
	}

	/*--------------------------------------------------------------------------------------*/

}
